#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>

void PrintPending(sigset_t &p_set)
{
    std::cout << "curr process[" << getpid() << "]pending: ";
    // 将信号集的信号状态打印出来
    for (int i = 31; i >= 1; i--)
    {
        if (sigismember(&p_set, i))
            std::cout << 1;
        else
            std::cout << 0;
    }
    std::cout << std::endl;
}

void handler(int sig)
{
    std::cout << sig << "号信号被释放" << std::endl;
    std::cout << "------------------" << std::endl;
    sigset_t p_set;
    sigemptyset(&p_set);
    sigpending(&p_set);
    PrintPending(p_set);
    std::cout << "------------------" << std::endl;
}
int main()
{
    // 0.捕捉2号新号
    signal(2, handler);
    signal(2, SIG_IGN);
    signal(2, SIG_DFL);
    // 1.设置信号集
    sigset_t block_set, old_set;
    // 初始化
    sigemptyset(&block_set);
    sigemptyset(&old_set);
    // 将2号信号添加到信号集
    sigaddset(&block_set, 2);

    // 2.修改进程的信号屏蔽字
    sigprocmask(SIG_SETMASK, &block_set, &old_set);

    int cnt = 15;
    while (1)
    {
        sleep(1);

        // 获取未决信号集
        sigset_t p_set;
        sigemptyset(&p_set);
        sigpending(&p_set);

        // 3.打印未决信号集
        PrintPending(p_set);

        // 4.阻塞信号被释放，立即递达
        if (--cnt == 0)
            sigprocmask(SIG_SETMASK, &old_set, &block_set);
    }
    return 0;
}